package strategy;

import java.util.List;

import root.item.ItemListener;
import root.loan.EmprestimoListener;
import root.message.Message;
import root.message.MessageType;
import root.user.User;
import exceptions.InexistentTopic;
import exceptions.InexistentType;
import exceptions.InvalidMessage;
import exceptions.InvalidReceiver;
import exceptions.InvalidSender;
import exceptions.InvalidSubject;
import exceptions.InvalidTopic;
import exceptions.InvalidType;

/**
 * Classe gerenciadora de mensagens.
 * Encarregada das operacoes que envolvem
 * mensagens. Utiliza o padrao Strategy.
 */
public interface GerenciadorMensagemIF extends ItemListener, EmprestimoListener{


	public void addMessage2(Message message);

	/**
	 * Envia uma mensagem assim como as outras, entretanto o tipo padrao já eh
	 * de NEgociacao, e voce passa ql id do emprestimo...
	 * 
	 * @param sender
	 * @param receiver
	 * @param subject
	 * @param message
	 * @param idEmprestimo
	 * @return
	 * @throws Exception
	 */
	public String createMessage(User receiver, String subject,
			String message, String idEmprestimo) throws Exception;

	/**
	 * Cria uma mensagem
	 * 
	 * @param sender
	 *            Usuário que enviou a mensagem
	 * @param receiver
	 *            Usuário que recebeu a mensagem
	 * @param subject
	 *            Assunto da mensagem
	 * @param message
	 *            Corpo da mensagem
	 * @param messageType
	 *            Tipo da Mensagem
	 * @return
	 * @throws InvalidSender
	 * @throws InvalidReceiver
	 * @throws InvalidMessage
	 * @throws InvalidSubject
	 */
	public String createMessage(User receiver, String subject,
			String message, MessageType messageType) throws
			InvalidReceiver, InvalidMessage, InvalidSubject;

	/**
	 * Envia uma mensagem
	 * 
	 * @param sender
	 *            Remetetne
	 * @param receiver
	 *            Destinatario
	 * @param subject
	 *            Assunto
	 * @param message
	 *            Mensagem
	 * @param messageType
	 *            Se eh Off-Topic ou NEgociacao, use o enum MessageType
	 * @return Id do Topico que no caso eh o proprio subject
	 * @throws InvalidMessage
	 * @throws InvalidSubject
	 * @throws InvalidReceiver
	 */
	public String createMessage(User sender, User receiver, String subject,
			String message, MessageType messageType) throws InvalidMessage,
			InvalidSubject, InvalidReceiver;

	/**
	 * Padrão Abstract, recebe uma string informando o Tipo e retorna o
	 * MessageType equivalente
	 * 
	 * @param tipo
	 * @return
	 * @throws InvalidType
	 * @throws InexistentType
	 */
	public MessageType converType(String tipo) throws InvalidType,
			InexistentType;

	/**
	 * Retorna uma lista de string contendo todos os tópicos do usuário que
	 * seguem determinado tipo de mensagem.
	 * 
	 * @param messageType
	 * @return
	 */
	public List<String> getAllTopics(MessageType messageType);

	/**
	 * Usa esse metodo no main, pq ele reotrna uma string
	 * 
	 * @param a
	 * @param messageType
	 * @return
	 */
	public String getTopics(MessageType messageType);
	
	public String getTopics(String messageType) throws InvalidType, InexistentType;

	/**
	 * Metodo auxiliar que recebe uma lista de string e converte em uma string é
	 * usado no teste de aceitação
	 * 
	 * @param ret
	 * @param emptyMessage
	 * @return
	 */
	public String convertListString(List<String> ret, String emptyMessage);

	/**
	 * Converte uma lista de mensagens para uma list de string.
	 * 
	 * @param messages
	 * @return
	 */
	public List<String> convertMessagesToString(List<Message> messages);

	/**
	 * Retorna uma string contendo todas as mensagens de um usuário de
	 * determinado tópico
	 * 
	 * @param user
	 * @param topic
	 * @return
	 * @throws InvalidTopic
	 * @throws InexistentTopic
	 */
	public String getStringMessages(String topic)
			throws InvalidTopic, InexistentTopic;

	

	/**
	 * Retorna uma lista de mensagens de um usuário de um determinado
	 * tópico
	 * @param user
	 * @param topic
	 * @return
	 * @throws InvalidTopic
	 * @throws InexistentTopic
	 */
	public List<Message> getAllMessagesByTopic(String topic)
			throws InvalidTopic, InexistentTopic;

}
